慕课网Flask高级编程实战-知识点思维导图

虚拟环境搭建[二选一即可]

pipenv 安装与使用

Github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#方式一:
## mac 用户
$ brew install pipenv

## Fedora用户
$ sudo dnf install pipenv

#方式二:

#用 pip 安装 pipenv
pip install pipenv

#进入虚拟环境(需要在你放置项目的地方执行,如果没有文件则会新建文件夹)
pipenv blog

# 退出虚拟环境
pipenv exit

#使用 pipenv 安装类库
pipenv install {package}

# 卸载类库
pipenv uninstall {package}

# 查看安装包依赖
pipenv graph

#查看虚拟环境的执行文件路径
pipenv --env

virtualenvwrapper

virtualenvwrapper是用来管理virtualenv的扩展包,用着很方便。

项目地址

virtualenvwrapper

安装

1
2
3
4
5
#安装virtualenv
pip install virtualenv

#安装virtualenvwrapper
pip install virtualenvwrapper

配置

修改~/.bash_profile或其它环境变量相关文件(如 .bashrc(我的Ubuntu15.10 下的是这个) 或用 ZSH 之后的 .zshrc),添加以下语句:

1
2
3
4
5
6
7
8
#WORKON_HOME,PROJECT_HOME 可以替换成你自己的目录
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh

#然后运行下面代买生效:

source ~/.bash_profile

用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#创建运行环境blog
mkvirtualenv blog

#工作在 blog 环境 或 从其它环境切换到 blog 环境
workon blog

#退出终端环境
deactivate

#删除运行环境ENV
rmvirtualenv ENV

#创建mic项目和运行环境mic
mkproject mic

#创建临时运行环境
mktmpenv

#列出可用的运行环境
lsvirtualenv

#列出当前环境安装了的包
lssitepackages

Flask 的实例化和启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#导入 Flask 模块包
from flask import Flask

#实例化对象 app 构造函数的参数会作为 Flask app 核心对象的标识。可以用其他的标识符代替。如:项目名称 blog

app = Flask(__name__)

#启动 web app
#host 参数指定可以访问本网站的 IP 地址。“0.0.0.0”表示任何主机都可以访问
#port 参数指定启动端口。如:localhost:8000
#debug 参数表示开启调试模式,开启之后,有以下优势。但是生产环境不建议使用。
# 1.修改文件不需要每次手动重启,服务器会自动重启,
# 2.如果发生错误,可以看到详细的错误信息

app.run(host="0.0.0.0",port=8000,debug=True)

注册路由方式一

1
2
3
4
5
#使用装饰器来诸恶路由,启动的参数为 URL 的路径,对应的会调用 index() 函数
@app.route('/index')
def index():
“““定义视图函数 相当于 MVC 中的 Controller”””
return "首页"

如果直接使用/index

那么不能兼容浏览器不能访问/index/和/index,

解决办法,路径定义改成/index/

1
2
3
4
@app.route('/index/')
def index():
“““基于类的视图,相当于 MVC 中的 Controller”””
return "首页"

在路径xxx后添加斜杠/后就可以访问xxx/ 和 xxx的原理

重定向:当你访问url1的时候,服务器返回状态码302让用户访问url2

访问http://localhost:5000/index,观察浏览器网络请求情况,可以看到发生了重定向,重定向到了http://localhost:5000/index/

为什么这么做呢?

这是因为,如果不做重定向,不带/ 的(index)和带/的(index/)都可以访问到视图函数。

那么就是说同一个视图函数对应着两个不同的路由,没有保证唯一url的原则

唯一url的好处

如果有两个url,那么在搜索引擎中会被索引两次,

这样会浪费性能,影响搜索引擎的优化,没有这个必要。

注册路由方式二

1
2
#通过调用app的add_url_rule函数
app.add_url_rule("/hello",view_func=hello)
  • 实际上方法1装饰器的模式,内部就是调用了add_url_rule函数。下面来看一下源码
1
2
3
4
5
6
7
8
9
10
def route(self, rule, **options):
"""Like :meth:`Flask.route` but for a blueprint. The endpoint for the
:func:`url_for` function is prefixed with the name of the blueprint.
"""
def decorator(f):
endpoint = options.pop("endpoint", f.__name__)
#划重点:实际内部调用的就是 add_url_rule
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator

Flask 配置文件

1
2
3
4
5
#载入配置文件
app.config.from_object("cofing")

#读取配置文件
pritn(app.config["APP_NAME"])

要点

  • 配置文件中的 KEY 必须全部是大写![必须大写!]
  • DEBUG 是 Flask 中的一个默认变量,如果想要覆盖,必须名字一模一样

if name == “name“:

为什么要添加这句:if __name__ == "__name__"

加入这个判断以后,只有在启动入口文件以后,才会执行。而在被其他模块导入的时候不会执行

加入的优势:

在生产环境中,我们一般是采用 Nginx + uwsgi 来部署我们的 Python 项目,我们使用 uwsgi 来启动项目的 flask 服务的时候,这个时候项目的启动文件(我们这项目文件名为:run.py),只是作为一个模块被调用,这时加上入口判断,在生产环境就就不会执行 app.run()方法,否则就会启动两个 Flask 服务。

1
2
3
# run.py 文件代码
if __name__ == "__name__":
app.run(host=app.config["HOST"], debug=app.config["DEBUG"], port=app.config["PORT"])